package model

import (
	"encoding/json"
	"server/common"
	"server/pkg/app"
)

type Fio struct {
	Model
	EnvConfig

	JobName  string          `gorm:"column:job_name;type:varchar(300)" json:"job_name"`
	RBW      string          `gorm:"column:rbw;type:varchar(50)" json:"rbw"`
	RIOPS    string          `gorm:"column:riops;type:varchar(50)" json:"riops"`
	WBW      string          `gorm:"column:wbw;type:varchar(50)" json:"wbw"`
	WIOPS    string          `gorm:"column:wiops;type:varchar(50)" json:"wiops"`
	WLazy    string          `gorm:"column:wlazy;type:varchar(50)" json:"wlazy"`
	RLazy    string          `gorm:"column:rlazy;type:varchar(50)" json:"rlazy"`
	IoEngine string          `gorm:"column:ioengine;type:varchar(50)" json:"ioengine"`
	IoDepth  int             `gorm:"column:iodepth;type:int" json:"iodepth"`
	Numjobs  int             `gorm:"column:numjobs;type:int" json:"numjobs"`
	Sync     int             `gorm:"column:sync;type:int" json:"sync"`
	Direct   int             `gorm:"column:direct;type:int" json:"direct"`
	Nrfiles  int             `gorm:"column:nrfiles;type:int" json:"nrfiles"`
	Bs       string          `gorm:"column:bs;type:varchar(50)" json:"bs"`
	Filesize string          `gorm:"column:filesize;type:varchar(50)" json:"filesize"`
	Size     string          `gorm:"column:size;type:varchar(50)" json:"size"`
	Clat_ns  json.RawMessage `gorm:"column:clat_ns;type:json" json:"clat_ns"`

	PerformanceID int         `json:"performance_id"`
	Performance   Performance `gorm:"references:ID"`
}

func (fio *Fio) TableName() string {
	return "fio"
}

func (fio *Fio) List(page *app.Page) ([]Fio, int64) {
	fio_list := []Fio{}
	var count int64
	db := common.DB
	if len(fio.Bs) != 0 {
		db.Where("bs like ?", fio.Bs)
	}
	if len(fio.Filesize) != 0 {
		db.Where("filesize like ?", fio.Filesize)
	}
	if len(fio.Size) != 0 {
		db.Where("bs like ?", fio.Size)
	}
	if len(fio.JobName) != 0 {
		db.Where("job_name like ?", fio.Size)
	}
	db.Order("ctime desc")
	if page.Page == -1 {
		if err := db.Find(&fio_list).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
			return fio_list, count
		}
	} else {
		if err := db.Limit(page.Size).Offset((page.Page - 1) * page.Size).Find(&fio_list).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
			return fio_list, count
		}
	}
	return fio_list, count
}

func (fio *Fio) Info() error {
	if err := common.DB.Where("id = ?", fio.JobName).Find(&fio).Error; err != nil {
		return err
	}
	return nil
}

func (fio *Fio) Create() error {
	if err := common.DB.Create(&fio).Error; err != nil {
		return err
	}
	return nil
}

func (fio *Fio) Update() error {
	if err := common.DB.Where("id = ?", fio.ID).Updates(&fio).Error; err != nil {
		return err
	}
	return nil
}

func (fio *Fio) Delete() error {
	if err := common.DB.Where("id = ?", fio.ID).Delete(&fio).Error; err != nil {
		return err
	}
	return nil
}
